﻿using EncryptTool;
using System;
using System.Collections;
using System.Collections.Generic;

namespace 群智感知激励系统服务端底层
{
    public class 虚拟货币
    {
        private static int 全局序号 = 1;
        public int 序号;
        static public List<虚拟货币> 总表 = new List<虚拟货币>();
        private static Hashtable hashtable = new Hashtable();
        public string id;
        public bool 可用性;
        private static Random ran = new Random();
        static public int 已发放激励 = 0;
        static public int 激励金额总数 = 0;
        public long 时刻;
        public string 时间戳;
        public 用户 所属用户;
        public string 加密id;

        public 虚拟货币(用户 用户, string _id)
        {
            id = _id;
            加密id = CSm4.加密(id);
            可用性 = true;
            时刻 = 全局.stopwatch.ElapsedMilliseconds;
            时间戳 = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss");
            所属用户 = 用户;
            序号 = 全局序号++;
        }

        public static List<虚拟货币> 产生虚拟货币(用户 用户, int num)
        {
            num += hashtable.Count;
            List<虚拟货币> 新货币列表 = new List<虚拟货币>();
            for (int i = 0; hashtable.Count < num; i++)
            {
                string str = GetRandomString(32, true, false, true, false, "");
                if (!hashtable.ContainsValue(str))
                {
                    hashtable.Add(str, str);
                    虚拟货币 新货币 = new 虚拟货币(用户, str);
                    总表.Add(新货币);
                    新货币列表.Add(新货币);
                }
            }
            return 新货币列表;
        }

        public static string GetRandomString(int length, bool useNum, bool useLow, bool useUpp, bool useSpe, string custom)
        {
            byte[] b = new byte[4];
            new System.Security.Cryptography.RNGCryptoServiceProvider().GetBytes(b);
            Random r = new Random(BitConverter.ToInt32(b, 0));
            string s = null, str = custom;
            if (useNum == true) { str += "0123456789"; }
            if (useLow == true) { str += "abcdefghijklmnopqrstuvwxyz"; }
            if (useUpp == true) { str += "ABCDEF"; }
            if (useSpe == true) { str += "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~"; }
            for (int i = 0; i < length; i++)
            {
                s += str.Substring(r.Next(0, str.Length - 1), 1);
            }
            return s;
        }

        public static 虚拟货币 虚拟货币混淆(用户 用户, 虚拟货币 源虚拟货币)
        {
            虚拟货币 目标虚拟货币 = 源虚拟货币;
            while (目标虚拟货币 == 源虚拟货币)
                目标虚拟货币 = 总表[ran.Next(0, 总表.Count)];
            源虚拟货币.可用性 = false;
            产生虚拟货币(用户, 1);
            return 目标虚拟货币;
        }
    }
}